package com.cyurs.netty.dubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * @Author: Cyrus
 * @CreateDate: 2020/11/30
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    private ChannelHandlerContext context;//上下文
    private String result;//返回的结果
    private String para;//客户端调用方法是，传入的参数

    //与服务器建立连接后，就会被调用，该方法是第一个调用的(1)/一旦建立连接只创建一次
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channelActive被调用");
        context = ctx; //在其他方法中需要使用ctx
    }
    //收到服务器的数据后，调用方法(4)
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("channelRead被调用");
        result = msg.toString();
        //随机唤醒等待的线程
        notify();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    //被代理对象调用，真正发送数据给服务器，->wait等待被唤醒,唤醒后返回结果(3)(5)
    @Override
    public synchronized Object call() throws Exception {
        System.out.println("call_1被调用");
        context.writeAndFlush(para);
        //进行wait
        wait(); //等待channelRead()方法获取到服务器响应的结果后唤醒
        System.out.println("call_2被调用");
        return result; //服务方返回的结果
    }
    //(2)
    void setPara(String para) {
        System.out.println("setPara");
        this.para = para;
    }
}
